package com.di.base.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.di.base.common.exception.BusinessException;
import com.di.base.dao.StorageTblDao;
import com.di.base.entity.StorageTbl;
import com.di.base.service.StorageTccService;
import io.seata.core.context.RootContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * StorageTccService 实现类，支持 Saga 模式
 */
@Slf4j
@Service("storageTccService") // Bean 名称必须与 JSON 中的 ServiceName 一致
public class StorageTccServiceImpl extends ServiceImpl<StorageTblDao, StorageTbl> implements StorageTccService {

    @Autowired
    private StorageTblDao storageTblMapper;

    /**
     * Saga 模式减少库存方法 (被状态机调用)
     *
     * @param productId
     * @param count
     * @return
     * @throws Exception
     */
    @Override
    @Transactional(rollbackFor = BusinessException.class)
    public void decrease(String productId, int count) {
        log.info("Saga模式 - 开始减少库存, XID: {}", RootContext.getXID());
//        if(true){
//            throw new BusinessException(500, "抛著玩");
//        }
        try {
            int updated = storageTblMapper.decreaseStorage(productId, count);
            if (updated == 0) {
                log.warn("Saga模式 - 库存不足或产品不存在, productId: {}, count: {}", productId, count);
                throw new BusinessException(500, "库存不足或产品不存在");
            }

            log.info("Saga模式 - 库存减少成功");
        } catch (BusinessException e) {
            log.error("Saga模式 - 减少库存异常", e);
            // 异常会被状态机捕获并转为 UN 状态，触发补偿
            throw e; // 或者 return "EXCEPTION";
        }
    }

    /**
     * Saga 模式增加库存方法 (补偿操作)
     *
     * @param productId
     * @param count
     * @return
     * @throws Exception
     */
    @Override
    @Transactional(rollbackFor = BusinessException.class)
    public void increase(String productId, int count) {
        log.info("Saga模式 - 开始补偿库存增加, XID: {}", RootContext.getXID());

        try {
            int updated = storageTblMapper.increaseStorage(productId, count);
            if (updated == 0) {
                log.warn("Saga模式 - 补偿失败，产品可能不存在, productId: {}", productId);
                throw new BusinessException(500, "补偿失败，产品可能不存在");
            }

            log.info("Saga模式 - 库存补偿增加成功");
        } catch (BusinessException e) {
            log.error("Saga模式 - 补偿库存增加异常", e);
            // 补偿失败也需要处理，可能需要人工介入
            throw e; // 或者 return "EXCEPTION";
        }
    }
}